package me.yushuai.wukong.base.api;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.yushuai.wukong.base.api.dto.*;
import me.yushuai.wukong.base.api.vo.PackingVO;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongWebException;
import me.yushuai.wukong.common.exceptin.NotExistException;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 包规管理客户端
 *
 * @author zhoushuai@189.cn
 * @since 2022-08-18
 */
@Api("包规 API")
@Component
@FeignClient("${spring.application.name}")
public interface PackingApi {

    /**
     * 新建一条包规记录
     *
     * @param dto 新建包规信息
     * @return 返回包规的编号
     * @throws WuKongWebException 当包规编码已经存在时抛出异常
     */
    @ApiOperation("新建包规")
    @PostMapping("/packing")
    Long createPacking(@RequestBody @Validated CreatePackingDTO dto) throws WuKongWebException;

    /**
     * 修改包规信息
     *
     * @param id        包规编号
     * @param dto 包规信息
     * @return 返回被修改的包规编号
     * @throws WuKongWebException 当包规编号不存在时抛出异常
     */
    @ApiOperation("修改包规")
    @PutMapping("/packing/{id}")
    Long editPacking(@PathVariable("id") Long id, @RequestBody @Validated UpdatePackingDTO dto)
            throws WuKongWebException;

    /**
     * 删除一条包规记录
     *
     * @param id 包规编号
     * @return 返回删除成功包规编号
     * @throws WuKongWebException 当包装不存在时抛出异常
     */
    @ApiOperation("删除包规")
    @DeleteMapping("/packing/{id}")
    Long deletePacking(@PathVariable("id") Long id) throws WuKongWebException;

    /**
     * 获取包规的详细信息
     *
     * @param id 包规编号
     * @return 返回包装详细信息
     * @throws NotExistException 当包装信息不存在时抛出异常
     */
    @ApiOperation("包规详细信息")
    @GetMapping("/packing/{id}")
    PackingDTO getById(@PathVariable("id") Long id) throws NotExistException;


    /**
     * 检索包规并返回包规列表
     *
     * @param dto 包规检索条件信息
     * @return 返回包规列表
     */
    @PostMapping("/packing-list")
    PageDTO<PackingVO> pagingSearchPacking(@RequestBody PagingSearchPacking dto);


    /**
     * 新建一条包规单位记录
     *
     * @param packingId     包规Id
     * @param packingUomDTO 新建包规单位信息
     * @return 返回包规单位的编号
     * @throws WuKongWebException 当包规单位编码已经存在时抛出异常
     */
    @ApiOperation("新建包规单位")
    @PostMapping("/packing/{packingId}/packing-uom")
    Long createPackingUom(@PathVariable("packingId") Long packingId, @Validated PackingUomDTO packingUomDTO)
            throws WuKongWebException;

    /**
     * 修改包规单位信息
     *
     * @param packingId     包规Id
     * @param packingUomId  包规单位编号
     * @param dto 包规单位信息
     * @return 返回被修改的包规单位编号
     * @throws WuKongWebException 当包规单位编号不存在时抛出异常
     */
    @ApiOperation("修改包规单位")
    @PutMapping("/packing/{packingId}/packing-uom/{packingUomId}")
    Long editPackingUom(@PathVariable("packingId") Long packingId, @PathVariable("packingUomId") Long packingUomId,
                        @Validated PackingUomDTO dto) throws WuKongWebException;

    /**
     * 删除一条包规单位信息
     *
     * @param packingId    产品编号
     * @param packingUomId 包规单位编号
     * @return 返回包规单位的编号
     * @throws WuKongWebException 当包规单位不存在时抛出异常
     */
    @ApiOperation("删除包规单位")
    @DeleteMapping("/packing/{packingId}/packing-uom/{packingUomId}")
    Long deletePackingUom(@PathVariable("packingId") Long packingId, @PathVariable("packingUomId") Long packingUomId)
            throws WuKongWebException;

    /**
     * 获取包规单位详细信息
     *
     * @param packingId    产品编号
     * @param packingUomId 包规单位编号
     * @return 返回包规单位详细信息
     * @throws NotExistException 当包规单位信息不存在时抛出异常
     */
    @ApiOperation("包规单位详细信息")
    @GetMapping("/packing/{packingId}/packing-uom/{packingUomId}")
    PackingUomDTO getById(@PathVariable("packingId") Long packingId, @PathVariable("packingUomId") Long packingUomId)
            throws NotExistException;

}
